<?php
namespace app\controller;

use think\facade\Db;
use app\model\Menu;
use app\model\User;
use app\model\Right;
use app\model\Role;
use app\BaseController;
use think\facade\Request;


class Homep extends BaseController
{
    public function menu()
    {
        //$userId = Request::param('userId');
        $userId=$this->request->auth['data']->user->user_id;
        //检查用户是否为超级管理员
        $isRoot = Db::table('user')->where('user_id', $userId)->value('user_root');

        // 如果是超级管理员，直接获取所有菜单
        if ($isRoot == 1) {
            $menus = Db::name('menu')->select();
            $menuTree = $this->buildMenuTree($menus);

            // 提取出需要排序的字段
            $menuSort = array_column($menuTree, 'menu_sort');

            // 将$menuTree1按照$menuSort进行排序
            array_multisort($menuSort, SORT_ASC, $menuTree);


            // 转换为JSON输出
            return json(['code'=>200,'data'=>$menuTree]);

        } else {
            // 否则，根据用户的角色(未被关闭的角色)获取菜单权限
            $userRoles = Db::name('vw_user_role1')->where('user_id', $userId)->where('role_switch', 1)->column('role_id');

            // 获取角色对应的权限
            $roleRights = Db::name('role_right')
                ->whereIn('role_id', $userRoles)
                ->column('right_id');

            // 获取权限对应的菜单
            $menuIds = Db::name('right')
                ->whereIn('right_id', $roleRights)
                ->column('right_menu_id');

            // 获取菜单信息
            $menus = Db::name('menu')
                ->whereIn('menu_id', $menuIds)
                ->select();

            // 构建菜单树形结构
            $allmenus = $this->recursiveQueryMenu($menus);
            $menuTree = $this->buildMenuTree($allmenus);
            $menuTree1 = $this->removeDuplicates($menuTree);

            if(empty($menuTree1)){
                return json(['code'=>201,'msg'=>'无任何权限','data'=>[]]);
            }

            // 提取出需要排序的字段
            $menuSort = array_column($menuTree1, 'menu_sort');

            // 将$menuTree1按照$menuSort进行排序
            array_multisort($menuSort, SORT_ASC, $menuTree1);


             return json(['code'=>200,'data'=>array_values($menuTree1)]);
        }


    }

    /**
     * 构建菜单树形结构
     *
     * @param array $menus 菜单列表
     * @return array 菜单树形结构
     */
    private function buildMenuTree($menus)
    {
        $tree = [];
        $menuMap = [];

        // 创建菜单ID到菜单数组的映射
        foreach ($menus as $menu) {
            $menuMap[$menu['menu_id']] = $menu;
            if (!isset($menu['menu_parent_id'])) {
                $menu['parent_id'] = 0; // 如果没有父级ID，则默认为0
            }
        }

        // 遍历菜单列表，构建树形结构
        foreach ($menus as $menu) {
            if (isset($menuMap[$menu['menu_parent_id']])) {
                $parentMenu = &$menuMap[$menu['menu_parent_id']]['child'];
                if (!isset($parentMenu)) {
                    $parentMenu = [];
                }
                $parentMenu[] = &$menuMap[$menu['menu_id']];
            } else {
                $tree[] = &$menuMap[$menu['menu_id']];
            }
        }

        return $tree;
    }

    //递归查询父级菜单
    private function recursiveQueryMenu($menuArray)
    {
        $result = [];

        // 遍历菜单数组
        foreach ($menuArray as $menu) {
            // 从数据库中获取当前菜单项及其子菜单项
            $subMenu = Db::name('menu')
                ->where('menu_id', $menu['menu_parent_id'])
                ->select();

            // 如果当前菜单项有子菜单项，则递归查询
            if (!empty($subMenu)) {
                // 递归查询子菜单项，并将结果合并到当前结果中
                $result = array_merge($result, [$menu], $this->recursiveQueryMenu($subMenu->toArray()));
            } else {
                // 如果没有子菜单项，则直接添加当前菜单项到结果中
                $result[] = $menu;
            }

            // 如果menu_parent_id为null，则结束递归
            if (is_null($menu['menu_parent_id'])) {
                break;
            }
        }

        return $result;
    }

  //去重
    private function removeDuplicates($menus)
    {
        $seen = [];

        // 自定义比较函数，用于检查两个菜单项是否相同
        $compareMenus = function ($a, $b) {
            // 这里假设两个菜单项完全相同当且仅当它们的所有键值对都相同
            return $a['menu_id'] === $b['menu_id']
                && $a['menu_name'] === $b['menu_name']
                && $a['menu_path'] === $b['menu_path']
                && $a['menu_icon'] === $b['menu_icon']
                && $a['menu_parent_id'] === $b['menu_parent_id']
                && $a['menu_route'] === $b['menu_route'];
        };

        // 使用 array_filter 来过滤掉重复的菜单项
        return array_filter($menus, function ($menu) use (&$seen, $compareMenus) {
            // 将当前菜单项转换为字符串，以便在$seen数组中存储和查找
            $menuString = json_encode($menu);

            // 如果当前菜单项尚未被见过，则将其添加到$seen数组中，并返回true以保留该菜单项
            if (!isset($seen[$menuString])) {
                $seen[$menuString] = true;
                return true;
            }

            // 如果当前菜单项已经被见过，则返回false以移除该菜单项
            return false;
        });
    }


}